home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol05 / 02 / checker3 / ckrjudge.c < prev    next >
C/C++ Source or Header  |  1990-03-19  |  6KB  |  183 lines

  1. /*---------------------------------------------------------------
  2.    CKRJUDGE.C -- JudgeWndProc for controlling game, Version 0.30
  3.                  (c) 1990, Charles Petzold
  4.   ---------------------------------------------------------------*/
  5.  
  6. #include <os2.h>
  7. #include "checkers.h"
  8. #include "ckrmoves.h"
  9.  
  10. MRESULT EXPENTRY JudgeWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  11.      {
  12.      static BOOL  fKing, fNewKing, fMustJump ;
  13.      static BOARD brd = { 0x00000FFF, 0xFFF00000, 0x00000000 }, brdLast ;
  14.      static HWND  hwndBoard ;
  15.      static SHORT sColor = BLACK, iBegin, iEnd, iJump ;
  16.      ULONG        ulBit, ulMove, ulJump ;
  17.  
  18.      switch (msg)
  19.           {
  20.           case WM_TELL_JUDGE_BOARD_HANDLE:
  21.                hwndBoard = HWNDFROMMP (mp1) ;
  22.                return 0 ;
  23.  
  24.           case WM_TELL_JUDGE_NEW_GAME:
  25.                brd.ulBlack = 0x00000FFF ;
  26.                brd.ulWhite = 0xFFF00000 ;
  27.                brd.ulKing  = 0x00000000 ;
  28.  
  29.                sColor = BLACK ;
  30.  
  31.                WinSendMsg (hwndBoard, WM_JUDGE_SAYS_RESET_BOARD, NULL, NULL) ;
  32.                WinSendMsg (hwndBoard, WM_JUDGE_SAYS_MOVE_BLACK, NULL, NULL) ;
  33.                return 0 ;
  34.  
  35.           case WM_QUERY_JUDGE_CURRENT_BOARD:
  36.                * (PBOARD) PVOIDFROMMP(mp1) = brd ;
  37.                return 0 ;
  38.  
  39.           case WM_QUERY_JUDGE_PICKUP_PIECE:
  40.                iBegin    = SHORT1FROMMP (mp1) ;
  41.                ulBit     = 1L << iBegin ;
  42.                fKing     = brd.ulKing & ulBit ? TRUE : FALSE ;
  43.                fMustJump = FALSE ;
  44.                fNewKing  = FALSE ;
  45.                ulMove    = CkmQueryAllMoveablePieces (&brd, sColor) ;
  46.                ulJump    = CkmQueryAllJumpablePieces (&brd, sColor) ;
  47.  
  48.                if (ulJump != 0)         // ie, some possible jumps
  49.                     {
  50.                     if (!(ulBit & ulJump))
  51.                          return FALSE ;      // invalid piece for jumping
  52.  
  53.                     fMustJump = TRUE ;
  54.                     }
  55.                else                     // no possible jumps
  56.                     {
  57.                     if (!(ulBit & ulMove))   // invalid piece for moving
  58.                          return FALSE ;
  59.                     }
  60.                                         // save the board and adjust it
  61.                brdLast = brd ;
  62.  
  63.                if (sColor == BLACK)
  64.                     brd.ulBlack &= ~ulBit ;
  65.                else
  66.                     brd.ulWhite &= ~ulBit ;
  67.  
  68.                brd.ulKing &= ~ulBit ;
  69.  
  70.                return TRUE ;
  71.  
  72.           case WM_QUERY_JUDGE_IF_KING:
  73.                return fKing ;
  74.  
  75.           case WM_QUERY_JUDGE_PUTDOWN_PIECE:
  76.                ulBit  = 1L << iBegin ;
  77.                ulMove = CkmQueryMoveDestinations (&brdLast, sColor, ulBit) ;
  78.                ulJump = CkmQueryJumpDestinations (&brdLast, sColor, ulBit) ;
  79.                iEnd   = SHORT1FROMMP (mp1) ;
  80.                ulBit  = 1L << iEnd ;
  81.  
  82.                if (fMustJump)
  83.                     {
  84.                     if (!(ulBit & ulJump))
  85.                          return FALSE ;      // not a valid jump destination
  86.  
  87.                     iJump = CkmQueryJumpedPiece (iBegin, iEnd) ;
  88.                     }
  89.                else
  90.                     {
  91.                     if (!(ulBit & ulMove))
  92.                          return FALSE ;      // not a valid move destination
  93.  
  94.                     iJump = -1 ;
  95.                     }
  96.                                              // adjust board
  97.                brdLast = brd ;
  98.  
  99.                if (sColor == BLACK)
  100.                     {
  101.                     brd.ulBlack |= ulBit ;
  102.  
  103.                     if (iJump != -1)
  104.                          brd.ulWhite &= ~(1L << iJump) ;
  105.  
  106.                     if (iEnd >= 28 || fKing == TRUE)
  107.                          {
  108.                          brd.ulKing |= ulBit ;
  109.  
  110.                          if (!fKing)
  111.                               fNewKing = TRUE ;
  112.                          }
  113.                     }
  114.                else      // (sColor == WHITE)
  115.                     {
  116.                     brd.ulWhite |= ulBit ;
  117.  
  118.                     if (iJump != -1)
  119.                          brd.ulBlack &= ~(1L << iJump) ;
  120.  
  121.                     if (iEnd <= 3 || fKing == TRUE)
  122.                          {
  123.                          brd.ulKing |= ulBit ;
  124.  
  125.                          if (!fKing)
  126.                               fNewKing = TRUE ;
  127.                          }
  128.                     }
  129.  
  130.                if (fNewKing)
  131.                     fKing = TRUE ;
  132.                                              // inform board of jumped piece
  133.                if (iJump != -1)
  134.                     WinSendMsg (hwndBoard, WM_JUDGE_SAYS_REMOVE_PIECE,
  135.                                 MPFROMSHORT (iJump), NULL) ;
  136.                return TRUE ;
  137.  
  138.           case WM_QUERY_JUDGE_CONTINUE_MOVE:
  139.                if (fNewKing)
  140.                     return FALSE ;
  141.  
  142.                if (!fMustJump)
  143.                     return FALSE ;
  144.  
  145.                iBegin = SHORT1FROMMP (mp1) ;
  146.                ulBit  = 1L << iBegin ;
  147.                ulJump = CkmQueryAllJumpablePieces (&brd, sColor) ;
  148.  
  149.                if (ulBit & ulJump)
  150.                     {
  151.                     fMustJump = TRUE ;
  152.                     brdLast = brd ;
  153.  
  154.                     if (sColor == BLACK)
  155.                          brd.ulBlack &= ~ulBit ;
  156.                     else
  157.                          brd.ulWhite &= ~ulBit ;
  158.  
  159.                     brd.ulKing &= ~ulBit ;
  160.  
  161.                     return TRUE ;
  162.                     }
  163.  
  164.                return FALSE ;
  165.  
  166.           case WM_TELL_JUDGE_BOARD_MOVE_ENDED:
  167.                if (sColor == BLACK)
  168.                     {
  169.                     sColor = WHITE ;
  170.                     WinSendMsg (hwndBoard, WM_JUDGE_SAYS_MOVE_WHITE,
  171.                                 NULL, NULL) ;
  172.                     }
  173.                else
  174.                     {
  175.                     sColor = BLACK ;
  176.                     WinSendMsg (hwndBoard, WM_JUDGE_SAYS_MOVE_BLACK,
  177.                                 NULL, NULL) ;
  178.                     }
  179.                return 0 ;
  180.           }
  181.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  182.      }
  183.